package Day_0223.Spring;

/**
 * @author zxc
 * @date 2023/02/23 21:56
 **/
public class FactoryBean_BeanFactory {
    public static void main(String[] args) {
        /**
         * FactoryBean 和 BeanFactory的区别
         * ===》
         * 一.区别
         * （1）BeanFactory 是 Bean 的工厂， ApplicationContext 的父类，IOC 容器的核心，负责生产和管理Bean 对象。
         * （2）FactoryBean 是 Bean，可以通过实现 FactoryBean 接口定制实例化 Bean 的逻辑，
         *  通过代理一个Bean对象，对方法前后做一些操作。
         *
         * 二，BeanFactory详解
         * 1.BeanFactory 是IOC容器的底层实现接口，是ApplicationContext 顶级接口
         * 2.spring不允许我们直接操作 BeanFactory bean工厂，所以提供了ApplicationContext 这个接口
         * 3.ApplicationContext此接口集成BeanFactory 接口，ApplicationContext包含BeanFactory的所有功能,同时还进行更多的扩展。
         * 4.BeanFactory 接口又衍生出以下接口，经常用到的是ApplicationContext 接口
         * 1）ConfigurableApplicationContext ：
         * ===》主要作用在ioc容器进行相应的刷新，关闭等操作！
         * 2）FileSystemXmlApplicationContext 和 ClassPathXmlApplicationContext ：
         * ===》是用来读取xml文件创建bean对象
         * （1）ClassPathXmlApplicationContext ： 读取类路径下xml文件，来创建bean
         * （2）FileSystemXmlApplicationContext ：读取文件系统下xml文件，来创建bean
         * 3）AnnotationConfigApplicationContext ：
         * ===》主要是注解开发获取ioc中的bean实例
         *
         * 三，FactoryBean详解
         * 1.FactoryBean 是spring提供的工厂bean的一个接口
         * 2.FactoryBean 接口提供三个方法，用来创建对象，
         * 3.FactoryBean 具体返回的对象是由getObject 方法决定的。
         * ===》
         * 4.FactoryBean接口 ：
         * ===》
         * public interface FactoryBean<T> {
         * //工厂bean 具体创建具体对象是由此getObject()方法来返回的
         * @Nullable
         * T getObject() throws Exception;
         *
         * //创建的具体bean对象的类型
         * @Nullable
         * Class<?> getObjectType();
         *
         * //是否单例
         * default boolean isSingleton() {
         * return true;
         * }
         * }
         *
         * ===》
         * 总结 ：
         * （1）BeanFactory是个bean 工厂，是一个工厂类(接口)， 它负责生产和管理bean的一个工厂
         *  是ioc 容器最底层的接口，是个ioc容器，是spring用来管理和装配普通bean的ioc容器（这些bean成为普通bean）。
         * （2）FactoryBean是个bean，在IOC容器的基础上，给Bean的实现加上了一个简单工厂模式和装饰模式，
         *  是一个可以生产对象和装饰对象的工厂bean，由spring管理后，生产的对象是由getObject()方法决定的
         *  （从容器中获取到的对象不是"FactoryBeanTest"对象）。
         *
         *
         */
    }
}
